Разница между @ViewChild() и @ContentChild()?
@ViewChild() и @ContentChild() - это два декоратора в Angular, которые используются для доступа к дочерним элементам в компонентах. Они имеют некоторые различия в том, как они ищут и выбирают элементы. Давайте рассмотрим эти различия подробнее:
@ViewChild():- Используется для доступа к дочерним элементам, которые являются компонентами или простыми HTML-элементами, например,
<div>,<input>,<button>, и т.д. - Ищет элементы только в шаблоне текущего компонента.
- Может быть использован с селекторами, чтобы указать конкретный дочерний элемент, к которому нужно получить доступ.
- Позволяет получать доступ к экземпляру компонента или элементу DOM, используя переменную-ссылку.
- Используется для доступа к дочерним элементам, которые являются компонентами или простыми HTML-элементами, например,
Вот пример использования @ViewChild() для доступа к компоненту и элементу DOM:
import { Component, ViewChild, ElementRef } from '@angular/core'
@Component({
selector: 'app-parent',
template: `
<app-child></app-child>
<button #btnRef>Click</button>
`
})
export class ParentComponent {
@ViewChild(ChildComponent) childComponent: ChildComponent
@ViewChild('btnRef') buttonRef: ElementRef
ngAfterViewInit() {
this.childComponent.doSomething()
this.buttonRef.nativeElement.style.backgroundColor = 'red'
}
}
В этом примере мы используем @ViewChild(ChildComponent) для получения доступа к экземпляру дочернего компонента ChildComponent. Также мы используем @ViewChild('btnRef') для получения доступа к элементу <button> по селектору #btnRef.
@ContentChild():- Используется для доступа к дочерним элементам, которые включены в контент проекции внутри компонента.
- Ищет элементы внутри контента проекции компонента, который был включен с помощью
<ng-content>. - Также может быть использован с селекторами, чтобы указать конкретный дочерний элемент, к которому нужно получить доступ.
Вот пример использования @ContentChild() для доступа к дочернему элементу, включенному через <ng-content>:
import { Component, ContentChild } from '@angular/core'
@Component({
selector: 'app-parent',
template: `
<app-child>
<div #contentRef>Content</div>
</app-child>
`
})
export class ParentComponent {
@ContentChild('contentRef') contentRef
ngAfterContentInit() {
console.log(this.contentRef.nativeElement.textContent)
}
}
В этом примере мы используем @ContentChild('contentRef') для получения доступа к элементу <div> с селектором #contentRef, который был включен в контент проекции компонента ChildComponent с помощью <ng-content>.
В обоих случаях, для успешного использования декораторов @ViewChild() и @ContentChild(), нужно убедиться, что дочерние элементы уже созданы и доступны во время вызова соответствующего хука жизненного цикла компонента.